package com.dh.leetcode.two;

import org.junit.Assert;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName: _209_word_pattern
 * @Description: 290. 单词规律
 * @Author: shouzimu
 * <p>
 * 给定一种规律 pattern 和一个字符串 str ，判断 str 是否遵循相同的规律。
 * <p>
 * 这里的 遵循 指完全匹配，例如， pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
 * <p>
 * 示例1:
 * <p>
 * 输入: pattern = "abba", str = "dog cat cat dog"
 * 输出: true
 * 示例 2:
 * <p>
 * 输入:pattern = "abba", str = "dog cat cat fish"
 * 输出: false
 * 示例 3:
 * <p>
 * 输入: pattern = "aaaa", str = "dog cat cat dog"
 * 输出: false
 * 示例 4:
 * <p>
 * 输入: pattern = "abba", str = "dog dog dog dog"
 * 输出: false
 * 说明:
 * 你可以假设 pattern 只包含小写字母， str 包含了由单个空格分隔的小写字母。    
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/word-pattern
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @Date: 2020/12/16 15:18
 */
public class _209_word_pattern {

    /**
     * 错误思路，这样结果必然返回为true
     *
     * @param pattern
     * @param s
     * @return
     */
//    public boolean wordPattern(String pattern, String s) {
//        char[] array = pattern.trim().toCharArray();
//        String[] sArray = s.trim().split(" ");
//
//        if (array.length != sArray.length) {
//            return false;
//        }
//        for (int i = 0; i < array.length; i++) {
//            s = s.replace(sArray[i], String.valueOf(array[i]));
//        }
//        return s.replaceAll(" +", "").equals(pattern);
//    }

    /**
     * 使用map方式
     * <p>
     * 一开始只使用map1，扑街了，错误的实现方式 case1返回true
     * java 1ms >99  <97
     *
     * @param pattern
     * @param s
     * @return
     */
    public boolean wordPattern_ac1(String pattern, String s) {
        char[] array = pattern.trim().toCharArray();
        String[] sArray = s.trim().split(" ");

        if (array.length != sArray.length) {
            return false;
        }
        Map<Character, String> map = new HashMap<>(array.length);
        Map<String, Character> map2 = new HashMap<>(array.length);
        for (int i = 0; i < array.length; i++) {
            if (sArray[i].equals("")) {
                return false;
            }
            String tmps = map.put(array[i], sArray[i]);
            if (null != tmps && !tmps.equals(sArray[i])) {
                return false;
            }
            Character c = map2.put(sArray[i], array[i]);
            if (null != c && !c.equals(array[i])) {
                return false;
            }

        }
        return true;
    }

    public boolean wordPattern(String pattern, String s) {
        return true;
    }

    /**
     *
     */

    @Test
    public void wordPatternTest() {
        //case1
        Assert.assertEquals(false, wordPattern("abba", "dog dog dog dog"));
        Assert.assertEquals(false, wordPattern("a", ""));
        Assert.assertEquals(true, wordPattern("aaaa", "dog dog dog dog"));
        Assert.assertEquals(true, wordPattern("abba", "dog cat cat dog"));
        Assert.assertEquals(false, wordPattern("abba", "dog cat cat fish"));
        Assert.assertEquals(true, wordPattern("abbc", "dog cat cat fish"));
    }

}
